// Copyright (c) 2010 Bob Berkebile
// Please direct any bugs/comments/suggestions to http://www.pixelplacement.com
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

using UnityEngine;
using UnityEditor;
using System.Collections;

[CustomEditor(typeof(TweenPath))]
public class TweenPathEditor : Editor
{
	TweenPath _target;
	GUIStyle style = new GUIStyle();
	public static int count = 0;

	void OnEnable()
	{
		//i like bold handle labels since I'm getting old:
		style.fontStyle = FontStyle.Bold;
		style.normal.textColor = Color.white;
		_target = (TweenPath) target;

		//lock in a default path name:
		if (!_target.initialized)
		{
			_target.initialized = true;
			_target.pathName = "New Path " + ++count;
			_target.initialName = _target.pathName;
			Vector3 pos = _target.gameObject.transform.position;
			for (int i = 0; i < _target.nodes.Count; ++i)
			{
				_target.nodes[i] = pos +
									(new Vector3(Random.Range(-100, 100), Random.Range(-100, 100), Random.Range(-100, 100))).normalized*5;
			}
		}
	}

	public override void OnInspectorGUI()
	{
		//draw the path?
		EditorGUILayout.BeginHorizontal();
		EditorGUILayout.PrefixLabel("Path Visible");
		_target.pathVisible = EditorGUILayout.Toggle(_target.pathVisible);
		EditorGUILayout.EndHorizontal();

		//path name:
		EditorGUILayout.BeginHorizontal();
		EditorGUILayout.PrefixLabel("Path Name");
		_target.pathName = EditorGUILayout.TextField(_target.pathName);
		EditorGUILayout.EndHorizontal();

		if (_target.pathName == "")
		{
			_target.pathName = _target.initialName;
		}

		//path color:
		EditorGUILayout.BeginHorizontal();
		EditorGUILayout.PrefixLabel("Path Color");
		_target.pathColor = EditorGUILayout.ColorField(_target.pathColor);
		EditorGUILayout.EndHorizontal();

		//exploration segment count control:
		EditorGUILayout.BeginHorizontal();
		int nodeCount = Mathf.Max(2, EditorGUILayout.IntField("Path Nodes", _target.nodes.Count));
		EditorGUILayout.EndHorizontal();

		if (nodeCount > _target.nodes.Count)
		{
			//add node?
			Vector3 pos = Vector3.zero;
			if (_target.nodes.Count > 0)
				pos = _target.nodes[_target.nodes.Count - 1];
			for (int i = 0, j = nodeCount - _target.nodes.Count; i < j; i++)
			{
				_target.nodes.Add(pos +
								(new Vector3(Random.Range(-100, 100), Random.Range(-100, 100), Random.Range(-100, 100))).normalized*5);
			}
		}
		else if (nodeCount < _target.nodes.Count)
		{
			//remove node?
			if (EditorUtility.DisplayDialog("Remove path node?",
											"Shortening the node list will permantently destory parts of your path. This operation cannot be undone.",
											"OK", "Cancel"))
			{
				int removeCount = _target.nodes.Count - nodeCount;
				_target.nodes.RemoveRange(_target.nodes.Count - removeCount, removeCount);
			}
		}

		//node display:
		EditorGUI.indentLevel = 2;
		for (int i = 0; i < _target.nodes.Count; i++)
		{
			_target.nodes[i] = EditorGUILayout.Vector3Field("" + (i + 1), _target.nodes[i]);
		}

		//update and redraw:
		if (GUI.changed)
		{
			EditorUtility.SetDirty(_target);
		}
	}

	void OnSceneGUI()
	{
		if (_target.pathVisible)
		{
			if (_target.nodes.Count > 0)
			{
				//allow path adjustment undo:
				Undo.SetSnapshotTarget(_target, "Adjust iTween Path");

				//path begin and end labels:
				Handles.Label(_target.nodes[0], "'" + _target.pathName + "' Begin", style);
				Handles.Label(_target.nodes[_target.nodes.Count - 1], "'" + _target.pathName + "' End", style);

				//node handle display:
				for (int i = 0; i < _target.nodes.Count; i++)
				{
					_target.nodes[i] = Handles.PositionHandle(_target.nodes[i], Quaternion.identity);
				}
				if (GUI.changed)
				{
					EditorUtility.SetDirty(_target);
				}
			}
		}
	}
}